﻿using System.Text;
using System.Threading.Tasks;

namespace 异步不等于多线程
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("开始：" + Thread.CurrentThread.ManagedThreadId);

            //double result1 = await SumDoubleAsync(8000);   //前后线程+内部线程Id一样
            //double result1 = await SumDouble2Async(8000);   //前后线程Id不一样
            //Console.WriteLine(result1);


            //这个方法里面有await,但是还是没有异步执行，线程没有切换。“结束”也是要等待“DoSomethingAsync”执行完毕后才打印。
            //难道说 是因为“DoSomethingAsync”里面调用的“SumDoubleAsync”没有await（不是异步方法），所以没有异步执行？
            //
            DoSomethingAsync();
            //Console.ReadKey();
            //Console.WriteLine("结束：" + Thread.CurrentThread.ManagedThreadId);

            //感觉不是异步执行，而是同步执行：“结束”会等待“SumDoubleAsync”执行完毕后才打印。
            //SumDoubleAsync(10000000);
            //await SumDoubleAsync(10000000);
            //Console.WriteLine("结束："+Thread.CurrentThread.ManagedThreadId);
            //Console.ReadKey();



            //WriteSomething();
            Console.WriteLine("结束：" + Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
        }

        //重要：async方法里没有await，等同于同步方法。

        /*这个方法实际上是完全同步的，因为：
        它没有真正的异步操作（没有 await 真正的异步方法）
        它只是标记为 async，但执行的是 CPU 密集型计算（换成IO密集型操作也是一样的）
        当 await SumDoubleAsync(80000) 执行时，由于方法没有真正的异步点，它会同步运行完成
        */
        static async Task<double> SumDoubleAsync(int n)
        {
            double result = 0;
            Random random = new Random();

            for (int i = 0; i < n * n; i++)
            {
                result += random.NextDouble();
            }
            Console.WriteLine("SumDoubleAsync内部线程Id：" + Thread.CurrentThread.ManagedThreadId);
            return result;
        }
        /*
        static async Task<double> SumDouble2Async(int n)
        {
            return await
            Task.Run(() =>
            {
                double result = 0;
                Random random = new Random();

                for (int i = 0; i < n * n; i++)
                {
                    result += random.NextDouble();
                }

                return result;
            });
        }

        */
        public static async Task DoSomethingAsync()
        {
            //await Task.Delay(2000);
            await SumDoubleAsync(80000); //加不加 await 都一样，都在线程id=1里面。
            Console.WriteLine("Hello!" + Thread.CurrentThread.ManagedThreadId);
        }
        /*
        static async Task Write()
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 100000000; i++)
            {
                sb.Append("hello");
            }

            File.WriteAllText(@"D:\1.txt", sb.ToString());
        }
        
        static async Task WriteSomething()
        {
            await Write();
            Console.WriteLine("写入完成:" + Thread.CurrentThread.ManagedThreadId);
        }
        */
    }
}
